class Dog{
    public String name;
    public String color;
    public int age;
    //这个时候我们还可以在内部去进行属性的操作
    public void eat(){
        System.out.println(name + "吃饭");
    }
    public void bark(){
        System.out.println(name + "狂吠");
    }

}
public class TestDemo {
    //类的实例化
    //定义了一个类的这个过程，就相当于在计算机中定义了一种新的类型，

    public static void main(String[] args) {
        Dog dog = new Dog();

        //通过一个new关键字来实例化了一个dog对象
        //Dog dog = new Dog();
        //dog就是一个引用 指向了dog对象
        //int a   = 10;
        //通过对比等号前面的是类型，a和dog都是变量名，10和new Dog()都是代表的值
        //Dog只不过是进行实体化的对象。
        //用类类型创建对象的过程，称为类的实例化，在java中采用new关键字，配合类名来实例化对象。
        //所有通过new关键字生成的对象（属性）都储存在堆上，（行为）还是在方法区

        //关于对Dog dog = new Dog()的理解
        //dog是一个局部变量，在main方法中，那么就是在虚拟机栈上创建了一个空间
        //而我们已经知道了通过new关键字生成的对象（属性）都存储在堆上
        //所以也通过了上述的操作，dog也获得了Dog()对象（属性的）的地址，所以它指向了Dog()的对象（属性）


        //那么如何访问对象的属性呢
        //通过对象的引用来访问对象的属性

        //这时候把数据写进去
        dog.name = "初一";
        dog.age = 10;
        dog.color = "黄色";

        //这个时候通过对 对象的引用将这些值赋值给类中的属性（即在堆上的也会显示出它们的值）

        //对象的成员属性在没有赋值的时候引用类型默认的是null，简单类型对应的为0

        //这时候把数据读入并输出
        System.out.println(dog.name);
        System.out.println(dog.age);
        System.out.println(dog.color);

        dog.bark();
        dog.eat();//这时候就不用输出，因为在Dog类中它们本身是行为（方法），所以这个时候也就相当于调用
        System.out.println("==============");
        //变量名可以有无数个，所以我们还可以将其他的也按以上操作去进入到这个类中去
        Dog dog2 = new Dog();
        dog2.name = "初二";
        dog2.age = 13;
        dog2.color = "黑色";
        System.out.println(dog2.name);
        System.out.println(dog2.age);
        System.out.println(dog2.color);
        dog2.bark();
        dog2.eat();
        //那么dog2也会在一新的虚拟机栈上的栈帧上，并且指向了一个新的对象，虽然它们两者的对象的属性一样，但是两者的地址不一样
        //所以指向也会不同

        //结论：每次new了一个新的对象，都会去开辟一块新的内存
        //通过new关键字可以实例化多个对象，但是每个对象都是独立的，互不干扰的

        //new 关键字用于创建一个对象的实例.
        //使用 . 来访问对象中的属性和方法.
        //同一个类可以创建多个实例（即使多个对象）
        //类就是创建对象的模板
    }


}
